package mx.itesm.papamastodon.dienosaurs;

import android.util.Log;

import org.andengine.audio.music.Music;
import org.andengine.audio.music.MusicFactory;
import org.andengine.engine.camera.Camera;
import org.andengine.entity.particle.BatchedSpriteParticleSystem;
import org.andengine.entity.particle.emitter.CircleParticleEmitter;
import org.andengine.entity.particle.initializer.AccelerationParticleInitializer;
import org.andengine.entity.particle.initializer.ExpireParticleInitializer;
import org.andengine.entity.particle.initializer.ScaleParticleInitializer;
import org.andengine.entity.particle.initializer.VelocityParticleInitializer;
import org.andengine.entity.particle.modifier.AlphaParticleModifier;
import org.andengine.entity.particle.modifier.RotationParticleModifier;
import org.andengine.entity.scene.background.SpriteBackground;
import org.andengine.entity.sprite.AnimatedSprite;
import org.andengine.entity.sprite.ButtonSprite;
import org.andengine.entity.sprite.Sprite;
import org.andengine.entity.sprite.UncoloredSprite;
import org.andengine.input.touch.TouchEvent;
import org.andengine.opengl.util.GLState;

import java.io.IOException;

/**
 * Representa la escena con las opciones del menú principal
 *
 * @author Roberto Martínez Román
 */
public class EscenaMenu extends EscenaBase {
    // *** Fondo
    private AnimatedSprite kikki;
    private AnimatedSprite rexi;
    private AnimatedSprite dipi;
    private AnimatedSprite trici;
    private Sprite spriteFondo;
    private Sprite logo;
    private ButtonSprite btnJugar;
    private ButtonSprite btnAc;
    private ButtonSprite btnIns;


    @Override
    public void crearEscena() {


        // Creamos el sprite de manera óptima
        spriteFondo = new Sprite(0, 0, admRecursos.regionFondoMenu, admRecursos.vbom) {
            @Override
            protected void preDraw(GLState pGLState, Camera pCamera) {
                super.preDraw(pGLState, pCamera);
                pGLState.enableDither();
            }
        };

        logo=new Sprite(ControlJuego.ANCHO_CAMARA/2, ControlJuego.ALTO_CAMARA-130, admRecursos.logoreg,admRecursos.vbom);

        // Configuración de la imagen
        spriteFondo.setPosition(ControlJuego.ANCHO_CAMARA / 2, ControlJuego.ALTO_CAMARA / 2);

        // Crea el fondo de la pantalla
        SpriteBackground fondo = new SpriteBackground(0, 0, 0, spriteFondo);
        setBackground(fondo);
        setBackgroundEnabled(true);

        // Habilita los eventos de touch en ciertas áreas
        setTouchAreaBindingOnActionDownEnabled(true);

        CircleParticleEmitter circulo = new CircleParticleEmitter(ControlJuego.ANCHO_CAMARA/2,
                ControlJuego.ALTO_CAMARA-30,10);
        BatchedSpriteParticleSystem sistema = new BatchedSpriteParticleSystem(circulo,
                20, 30, 200, admRecursos.regionHumo, admRecursos.vbom);

        sistema.addParticleInitializer(new VelocityParticleInitializer<UncoloredSprite>(-20,-50, -30, 30));

        sistema.addParticleInitializer(new AccelerationParticleInitializer<UncoloredSprite>(0,20));

        float tiempoVida = 5;

        sistema.addParticleInitializer(new ExpireParticleInitializer<UncoloredSprite>(tiempoVida));

        sistema.addParticleInitializer(new ScaleParticleInitializer<UncoloredSprite>(0.5f,1.5f));

        sistema.addParticleModifier(new RotationParticleModifier<UncoloredSprite>(1,4,0,360));

        sistema.addParticleModifier(new AlphaParticleModifier<UncoloredSprite>(tiempoVida-2,tiempoVida+1,1,0.3f));

        // *** Agrega los botones al Menú
        btnJugar = new ButtonSprite(ControlJuego.ANCHO_CAMARA / 2, (ControlJuego.ALTO_CAMARA / 2)-150,
                admRecursos.regionBtnJugar, admRecursos.vbom) {
            // Aquí el código que ejecuta el botón cuando es presionado
            @Override
            public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) {
                if (pSceneTouchEvent.isActionUp()) {
                    // Cambia a la escena de JUEGO
                    admEscenas.crearEscenaNiveles();
                    admEscenas.setEscena(TipoEscena.ESCENA_NIVELES);
                    admEscenas.liberarEscenaMenu();
                }
                return super.onAreaTouched(pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY);
            }
        };



        btnIns = new ButtonSprite((ControlJuego.ANCHO_CAMARA / 2)-250, (ControlJuego.ALTO_CAMARA / 2)-150,
                admRecursos.regionInstru, admRecursos.vbom) {
            // Aquí el código que ejecuta el botón cuando es presionado
            @Override
            public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) {
                if (pSceneTouchEvent.isActionUp()) {
                    // Cambia a la escena de JUEGO
                    admEscenas.crearEscenaInstrucciones();
                    admEscenas.setEscena(TipoEscena.ESCENA_INSTRUCCIONES);
                    admEscenas.liberarEscenaMenu();
                }
                return super.onAreaTouched(pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY);
            }
        };

        btnAc = new ButtonSprite((ControlJuego.ANCHO_CAMARA / 2)+250, (ControlJuego.ALTO_CAMARA / 2)-150,
                admRecursos.regionBtnAc, admRecursos.vbom) {
            // Aquí el código que ejecuta el botón cuando es presionado
            @Override
            public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) {
                if (pSceneTouchEvent.isActionUp()) {
                    // Cambia a la escena de ACERCA DE
                    admEscenas.crearEscenaAjustes();
                    admEscenas.setEscena(TipoEscena.ESCENA_AJUSTES);
                    admEscenas.liberarEscenaMenu();
                }
                return super.onAreaTouched(pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY);
            }
        };

        kikki=new AnimatedSprite((ControlJuego.ANCHO_CAMARA/2)-300,ControlJuego.ALTO_CAMARA/2, AdministradorRecursos.getInstance().kikkireg, AdministradorRecursos.getInstance().vbom);
        kikki.animate(100);
        rexi=new AnimatedSprite((ControlJuego.ANCHO_CAMARA/2)-150,ControlJuego.ALTO_CAMARA/2, AdministradorRecursos.getInstance().rexireg, AdministradorRecursos.getInstance().vbom);
        rexi.animate(100);
        dipi=new AnimatedSprite((ControlJuego.ANCHO_CAMARA/2)+150,ControlJuego.ALTO_CAMARA/2, AdministradorRecursos.getInstance().dipireg, AdministradorRecursos.getInstance().vbom);
        dipi.animate(100);
        trici=new AnimatedSprite((ControlJuego.ANCHO_CAMARA/2)+300,ControlJuego.ALTO_CAMARA/2, AdministradorRecursos.getInstance().tricireg, AdministradorRecursos.getInstance().vbom);
        trici.animate(100);


        registerTouchArea(btnJugar);
        registerTouchArea(btnAc);
        registerTouchArea(btnIns);
        attachChild(logo);
        attachChild(kikki);
        attachChild(rexi);
        attachChild(dipi);
        attachChild(trici);
        attachChild(btnAc);
        attachChild(btnJugar);
        attachChild(btnIns);
        attachChild(sistema);


    }

    @Override
    public void onBackKeyPressed() {
        // Salir del juego
    }

    @Override
    public TipoEscena getTipoEscena() {
        return TipoEscena.ESCENA_MENU;
    }

    @Override
    public void liberarEscena() {
        // Liberar cada recurso usado en esta escena
        // FONDO
        spriteFondo.detachSelf();   // Se desconecta de la escena
        spriteFondo.dispose();      // Libera la memoria
        // Btn Jugar
        btnJugar.detachSelf();
        btnJugar.dispose();

        btnAc.detachSelf();
        btnAc.dispose();

        this.detachSelf();      // La escena se deconecta del engine
        this.dispose();         // Libera la memoria
    }
}


